import type { InjectionKey, Ref } from "vue";


export type IdType=string | number
// collapse item 的 属性
export interface ItemProps{
  id:IdType,
  title:string,
  isdisabled:boolean,
}


// 创建 context 
export interface MyCollaContext{
  activeItem:Ref<IdType[]>,
  handleActiveItem:(item:IdType)=>void,
}

//  为 context 创建 的 独一无二 的 key (用 symbol 实现)
export const MyCollaContextKey:InjectionKey<MyCollaContext> = Symbol('MyCollaContextKey')// 采用描述性标签，容易知道它的用途

// 传递给 父组件的参数
export interface CollaProps {
  modelValue:IdType[]// 初始就展开的标签
  accordion:boolean// 控制手风琴开关
}

// 注册事件 的 类型
// 这样写函数 就指定了函数的参数名，即：'update:modelValue' | 'change'
// 事件注册 以及 组件提交事件 只是调用的动作,传递了参数（函数体没确定）
// 函数具体的实现（函数体）是在外部。即哪边给的数据，哪个就负责事件函数的实现。
// （有没有发现：这是和依赖注入是一个道理，提供方（provide）提供 属性 和 方法，方法的逻辑也是提供方实现设定的
// ,接受方只负责调用，修改数据时只是调用提供方自己制定的方法,（所以说提供方时心甘情愿的））
// 因此总结来说，不管是 v-model 双向数据绑定，还是 依赖注入 都是 满足和遵循 单向数据流的。
// 多想，多理解，多总结。
export interface CollaEmits{
  (e:'update:modelValue' | 'change',val:IdType[]):void
}
